/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.vdab.voertuigen;

import be.vdab.util.Datum;
import be.vdab.util.mens.Mens;
import be.vdab.util.mens.MensException;
import be.vdab.util.mens.Rijbewijs;
import be.vdab.voertuigen.div.DIV;
import be.vdab.voertuigen.div.Nummerplaat;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;


/**
 *
 * @author dries.thieren
 */
abstract public class Voertuig implements Serializable,Comparable<Nummerplaat> {
    private final Nummerplaat nummerplaat= DIV.getInstance().getNummerplaat();
    private String merk;
    private Datum datumEersteIngebruikname;
    private int aankoopprijs;
    final int zitplaatsen;
    private ArrayList<Mens> inzittenden;
    private Mens bestuurder;
    
    public Voertuig(String merk, Datum datumEersteIngebruikname, int aankoopprijs, int zitplaatsen, Mens bestuurder, Mens... ingezetenen) {
        
        if (ingezetenen.length+1>zitplaatsen)
            System.out.println("teveel inzittenden");
        else 
        inzittenden=Arrays.asList(ingezetenen);
        this.inzittenden.add(bestuurder);
        this.merk=merk;
        this.datumEersteIngebruikname=datumEersteIngebruikname;
        this.aankoopprijs=aankoopprijs;
        this.bestuurder=bestuurder;
        this.zitplaatsen=zitplaatsen;
    }
    
    //METHODS
    public List<Mens> getIngezeteneExclusiefBestuurder() {
        return inzittenden;
    }
    public List<Mens> getIngezetenen() {
        return inzittenden;
    }
    public boolean isIngezetene(Mens mens) {
        return inzittenden.contains(mens);
    }
      protected Rijbewijs[] getToegestaneRijbewijzen() {
           return new Rijbewijs[]{Rijbewijs.B, Rijbewijs.BE};
      }
    public void addIngezetene(Mens mens) {
        inzittenden.add(mens);   
    }
    //Comparator
    public static Comparator<Voertuig> getMerkComparator(){
        return new Comparator<Voertuig>()  {
            @Override
            public int compare(Voertuig v1, Voertuig v2) {
                return (v1.getMerk().compareTo(v2.getMerk()));
               }
     };
                }
    public static Comparator<Voertuig> getAankoopprijsComparator(){
        return new Comparator<Voertuig>() {
            @Override
            public int compare(Voertuig v1, Voertuig v2) {
                if (v1.getAankoopprijs()==v2.getAankoopprijs())
                    return 0;
                if (v1.getAankoopprijs()<v2.getAankoopprijs())
                    return -1;
                else return 1;
            }
        };
    }
    //GETTERS AND SETTERS
      public Mens getBestuurder() {
          return bestuurder;
      }
      public void setBestuurder(Mens mens) {
          bestuurder=mens;
      }
    public String getMerk() {
        return merk;
    }
    public void setMerk(String merk) {
        this.merk = merk;
    }
    public Datum getDatumEersteIngebruikname() {
        return datumEersteIngebruikname;
    }
    public void setDatumEersteIngebruikname(Datum datumEersteIngebruikname) {
        this.datumEersteIngebruikname = datumEersteIngebruikname;
    }
    public int getAankoopprijs() {
        return aankoopprijs;
    }
    public Nummerplaat getNummerplaat() {
        return nummerplaat;
    }
    public void setAankoopprijs(int aankoopprijs) {
        this.aankoopprijs = aankoopprijs;
    }
    public List getInzittenden() {
        return inzittenden;
    }
    public void setInzittenden(Mens[] inzittenden) {
        this.inzittenden = Arrays.asList(inzittenden);
    }
  
    //COMPARETO EQUALS TOSTRING AND HASHCODE
    @Override
    public int compareTo(Nummerplaat plaat) {
        return this.nummerplaat.compareTo(plaat);
    }
    @Override 
    public boolean equals(Object o) {
        if (o instanceof Voertuig) {
            Voertuig v = (Voertuig) o;
            return this.nummerplaat.equals(v.getNummerplaat());
        }else return false;
            
    }
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 61 * hash + (this.nummerplaat != null ? this.nummerplaat.hashCode() : 0);
        return hash;
    }
    @Override
    public String toString(){
        return (this.getNummerplaat().toString()+" "+this.merk+" "+ this.datumEersteIngebruikname.toString()+" "+this.aankoopprijs+
                " "+this.bestuurder.toString()+" "+Arrays.toString(inzittenden.toArray(new Mens[0])).replaceAll("\\(", "").replaceAll("\\)",""));
    }
}
